home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Updaters / WhiteCap 3.0.4 / WhiteCap Source.sit / WhiteCap Source / Common / math / Plane.cpp < prev    next >
Text File  |  1999-07-24  |  2KB  |  103 lines

  1.  
  2. #include "Plane.h"
  3.  
  4.  
  5.  
  6.  
  7. void Plane::set( PFloat inX, PFloat inY, PFloat inZ, PFloat inD ) {
  8.     PFloat m = 1 / ( inX*inX + inY*inY + inZ*inZ );
  9.     
  10.     //if ( inD < 0 )
  11.     //    m = -m;
  12.         
  13.     mX = inX * m;
  14.     mY = inY * m;
  15.     mZ = inZ * m;
  16.     mD = inD * m;
  17. }
  18.  
  19.  
  20.  
  21. void Plane::set( const V3& inPt1, const V3& inPt2, const V3& inPt3 ) {
  22.     PFloat m, v1x, v1y, v1z, v2x, v2y, v2z, x, y, z;
  23.  
  24.     // v1.subtract( inPt1, inPt2 );
  25.     // v1.subtract( inPt3, inPt2 );
  26.     v1x = inPt1.mX-inPt2.mX; v1y = inPt1.mY-inPt2.mY; v1z = inPt1.mZ-inPt2.mZ; 
  27.     v2x = inPt3.mX-inPt2.mX; v2y = inPt3.mY-inPt2.mY; v2z = inPt3.mZ-inPt2.mZ; 
  28.     
  29.     // r.cross( v1, v2 );
  30.     x = v1z * v2y - v2z * v1y;
  31.     y = v2z * v1x - v1z * v2x;
  32.     z = v2x * v1y - v1x * v2y;
  33.  
  34.     // r.normalize();
  35.     m = 1 / sqrt( x * x + y * y + z * z );
  36.     x *= m;
  37.     y *= m;
  38.     z *= m;
  39.     
  40.     // this <- r
  41.     mX = x;
  42.     mY = y;
  43.     mZ = z;
  44.     
  45.     // r.dot( inPt1 )
  46.     mD = inPt1.mX * x + inPt1.mY * y + inPt1.mZ * z;
  47. }
  48.  
  49.  
  50. void Plane::set( const V3& inNormal, PFloat inD ) {
  51.     PFloat m = 1 / inNormal.magnitude();
  52.     
  53.     //if ( inD < 0 )
  54.     //    m = -m;
  55.         
  56.     mX = m * inNormal.mX;
  57.     mY = m * inNormal.mY;
  58.     mZ = m * inNormal.mZ;
  59.     mD = inD;
  60. }
  61.  
  62.  
  63.  
  64. void Plane::intersect( const Plane& inPlane, V3& outLine, V3& outPt ) {
  65.     V3        l1, l2;
  66.     PFloat    A1, A2, B1, B2, C1, C2, det;
  67.     
  68.     // The line is the cross product of the two normals to each plane
  69.     outLine.set( inPlane );
  70.     outLine.cross( *this );
  71.     
  72.     // Conv plane normals to local plane cords
  73.     l1.set( *this );
  74.     l2.set( inPlane );
  75.     
  76.     l1.toPlane( outLine );
  77.     l2.toPlane( outLine );
  78.     
  79.     
  80.     // Get eqns of lines formed by local plane and each plane
  81.     A1 = l1.mX;
  82.     B1 = l1.mY;
  83.     C1 = mD * sqrt( A1*A1 + B1*B1 );
  84.     A2 = l2.mX;
  85.     B2 = l2.mY;
  86.     C2 = inPlane.mD * sqrt( A2*A2 + B2*B2 );
  87.     
  88.     // Compute local intersection of two planes
  89.     det = B1*A2 - B2*A1;
  90.     outPt.mX = ( C2*B1 - C1*B2 ) / det;
  91.     outPt.mY = ( C1*A2 - C2*A1 ) / det;
  92.     outPt.mZ = outPt.mX * A1 + outPt.mY * B1 - C1;
  93.     outPt.mZ = outPt.mX * A2 + outPt.mY * B2 - C2;
  94.     outPt.mZ = 0;
  95.     
  96.     // Local to global
  97.     outPt.fromPlane( outLine );
  98. }
  99.  
  100.  
  101.  
  102.  
  103.